package com.example.ffepeg.util;

import java.util.*;

/**
 * 敏感词过滤工具类
 */
public class BadWordUtil {
    public static Set<String> words;

    public static   List<String> wordText = new ArrayList<>();
    public static   List<String> word= new ArrayList<>();
    public static Map<String,String> wordMap;
    public static Map<String,String> wordMaps;

    public static int minMatchTYpe = 1;      //最小匹配规则
    public static int maxMatchType = 2;      //最大匹配规则
    static{
        BadWordUtil.words = readTxtByLine(wordText,word);
        addBadWordToHashMap(BadWordUtil.words);

    }
    public static Set<String> readTxtByLine(List<String> wordText,List<String> word){
        for (String words:word){
            wordText.add(words);
        }
        Set<String> keyWordSet = new HashSet<String>();
        try{
            for (String temp:wordText ){
                keyWordSet.add(temp);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
        return keyWordSet;
    }
    /**
     * 检查文字中是否包含敏感字符，检查规则如下：<br>
     * @param txt
     * @param beginIndex
     * @param matchType
     * @return，如果存在，则返回敏感词字符的长度，不存在返回0
     * @version 1.0
     */
    @SuppressWarnings({ "rawtypes"})
    public static int checkBadWord(String txt,int beginIndex,int matchType){
        boolean  flag = false;    //敏感词结束标识位：用于敏感词只有1位的情况
        int matchFlag = 0;     //匹配标识数默认为0
        char word = 0;
        Map nowMap = wordMap;


        for(int i = beginIndex; i < txt.length() ; i++){
            word = txt.charAt(i);

            nowMap = (Map) nowMap.get(word);     //获取指定key
            if(nowMap != null){     //存在，则判断是否为最后一个
                matchFlag++;     //找到相应key，匹配标识+1
                if("1".equals(nowMap.get("isEnd"))){       //如果为最后一个匹配规则,结束循环，返回匹配标识数
                    flag = true;       //结束标志位为true
                    if(minMatchTYpe == matchType){    //最小规则，直接返回,最大规则还需继续查找
                        break;
                    }
                }
            }
            else{     //不存在，直接返回
                break;
            }
        }
        /*
         *
         * if(matchFlag < 2 && !flag){
            matchFlag = 0;
        }*/
        if(!flag){
            matchFlag = 0;
        }
        return matchFlag;
    }

    /**
     * 判断文字是否包含敏感字符
     * @param txt  文字
     * @param matchType  匹配规则 1：最小匹配规则，2：最大匹配规则
     * @return 若包含返回true，否则返回false
     * @version 1.0
     */
    public static boolean isContaintBadWord(String txt,int matchType){
        boolean flag = false;
        for(int i = 0 ; i < txt.length() ; i++){
            int matchFlag = checkBadWord(txt, i, matchType); //判断是否包含敏感字符
            if(matchFlag > 0){    //大于0存在，返回true
                flag = true;
            }
        }
        return flag;
    }

    /**
     * 替换敏感字字符
     * @param txt
     * @param matchType
     * @param replaceChar 替换字符，默认*
     * @version 1.0
     */
    public static String replaceBadWord(String txt,int matchType,String replaceChar){
        String resultTxt = txt;
        Set<String> set = getBadWord(txt, matchType);     //获取所有的敏感词
        Iterator<String> iterator = set.iterator();
        String word = null;
        String replaceString = null;
        while (iterator.hasNext()) {
            word = iterator.next();
            replaceString = getReplaceChars(replaceChar, word.length());

            resultTxt = resultTxt.replaceAll(word, replaceString);
        }

        return resultTxt;
    }
    /**
     * 获取文字中的敏感词
     * @param txt 文字
     * @param matchType 匹配规则 1：最小匹配规则，2：最大匹配规则
     * @return
     * @version 1.0
     */
    public static Set<String> getBadWord(String txt , int matchType){
        Set<String> sensitiveWordList = new HashSet<String>();
        for(int i = 0 ; i < txt.length() ; i++){
            int length = checkBadWord(txt, i, matchType);    //判断是否包含敏感字符
            if(length > 0){    //存在,加入list中
                sensitiveWordList.add(txt.substring(i, i+length));
                i = i + length - 1;    //减1的原因，是因为for会自增
            }
        }

        return sensitiveWordList;
    }

    /**
     * 获取替换字符串
     * @param replaceChar
     * @param length
     * @return
     * @version 1.0
     */
    private static String getReplaceChars(String replaceChar,int length){
        String resultReplace = replaceChar;
        for(int i = 1 ; i < length ; i++){
            resultReplace += replaceChar;
        }

        return resultReplace;
    }

    /**
     * TODO 将我们的敏感词库构建成了一个类似与一颗一颗的树，这样我们判断一个词是否为敏感词时就大大减少了检索的匹配范围。
     * @param keyWordSet 敏感词库
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void addBadWordToHashMap(Set<String> keyWordSet) {
        wordMap = new HashMap(keyWordSet.size());     //初始化敏感词容器，减少扩容操作
        String key = null;
        Map nowMap = null;
        Map<String, String> newWorMap = null;
        //迭代keyWordSet
        Iterator<String> iterator = keyWordSet.iterator();
        while(iterator.hasNext()){
            key = iterator.next();    //关键字
            nowMap = wordMap;
            for(int i = 0 ; i < key.length() ; i++){
                char keyChar = key.charAt(i);       //转换成char型
                Object wordMap = nowMap.get(keyChar);       //获取

                if(wordMap != null){        //如果存在该key，直接赋值
                    nowMap = (Map) wordMap;
                }
                else{     //不存在则，则构建一个map，同时将isEnd设置为0，因为他不是最后一个
                    newWorMap = new HashMap<String,String>();
                    newWorMap.put("isEnd", "0");     //不是最后一个
                    nowMap.put(keyChar, newWorMap);
                    nowMap = newWorMap;
                }

                if(i == key.length() - 1){
                    nowMap.put("isEnd", "1");    //最后一个
                }
            }
        }
    }


    public static void main(String[] args) {
        List<String> wordText = new ArrayList<>();
        List<String> word= new ArrayList<>();
        word.addAll(list);
        //在实际需要调用需要脱敏处理的业务处需要改动，下面有例子。word相当于你配置的敏感词
        Set<String> strings = BadWordUtil.readTxtByLine(wordText, word);
        BadWordUtil.addBadWordToHashMap(strings);
        String s1 = BadWordUtil.replaceBadWord(string, 2, "");
        System.err.println(s1);

        /*
            Set<String> strings = BadWordUtil.readTxtByLine(wordText, word);
            BadWordUtil.addBadWordToHashMap(strings);
            System.out.println("敏感词的数量：" + BadWordUtil.wordMap.size());
            String string = "这里是必要组织，高级部门，必须";
            System.out.println("待检测语句字数：" + string.length());
            long beginTime = System.currentTimeMillis();
            Set<String> set = BadWordUtil.getBadWord(string, 2);
            long endTime = System.currentTimeMillis();
            System.out.println("语句中包含敏感词的个数为：" + set.size() + "。包含：" + set);
            String s1 = BadWordUtil.replaceBadWord(string, 2, "*");
            System.out.println("脱敏后的语句为："+s1);
            System.out.println("总共消耗时间为：" + (endTime - beginTime));
         */

    }

    static List<String> list = Arrays.asList(
            "习近平","曾国藩","张之洞","左宗棠","林则徐","曾国荃","袁世凯","洪秀全","李秀成",
            "慈禧太后","魏源","盛宣怀","毛泽东","周恩来","罗荣桓","刘少奇","林彪","刘亚楼","宋庆龄",
            "陈毅","邓小平","李先念","胡耀邦","邓颖超","陈云","陈独秀","蔡和森",
            "王稼祥","任弼时","朱德","徐向前","刘伯承","彭德怀","贺龙","叶剑英","聂荣臻","罗瑞卿",
            "粟裕","秦基伟","许世友","陈明仁","许光达","陈为人","肖劲光","杨尚昆","吴克华",
            "王树声","陈伯达","贺炳炎","彭真","蒋介石","汪精卫","冯玉祥","白崇禧","李宗仁","何应钦",
            "李济深","黄绍竑","胡宗南","张学良","杨虎城","阎锡山","毛人凤","陈立夫","孔祥熙","蒋经国",
            "戴笠","顾祝同","侯德榜","孙家栋","周树人","孔庆鲜","孔繁慈","叶圣陶",
            "谢婉莹","朱自清","王凤梧","田汉","聂耳","郭沫若","冼星海","沈从文","梅兰芳","茅盾","张爱玲",
            "胡雪岩","孙中山","钟南山","李强","丁薛祥","何立峰","张国清","刘国中","王小洪","吴政隆",
            "江泽民","胡锦涛","江青","李克强","李坚华","赵乐际","王沪宁","韩正","剑","刀","箭","镰刀",
            "何立峰","何卫东"," 张又侠","蔡奇","李希","马兴瑞","王毅","尹力","石泰峰","刘国中","李干杰",
            "李书磊","李鸿忠","陈文清","陈吉宁","陈敏尔","袁家军","黄坤明");




    static String string = "好的，我将根据你提供的格式，将《春天的故事》改编成一个适合绘本的大纲：\n" +
            "\n" +
            "#### 1. 标题\n" +
            "- **《春天的奇迹》**\n" +
            "\n" +
            "丁薛祥在一边抽烟喝酒,袁隆平在研究院专研稻谷的进程\n"+
            "#### 2. 场景描述\n" +
            "- **封面**：一幅美丽的春日景象，阳光明媚，绿树成荫，远处是现代化的城市，近处是田野和农舍。\n" +
            "- **第1页**：1979年的中国，农村的景象，农民们在田里劳作，远处是简陋的房屋。\n" +
            "- **第2-3页**：邓小平站在地图前，手指着东南沿海地区，画出一个圈，示意设立经济特区。\n" +
            "- **第4-5页**：深圳等城市的建设现场，工人们热火朝天地工作，建筑逐渐拔地而起。\n" +
            "- **第6-7页**：深圳的夜景，高楼大厦灯火辉煌，街道上车水马龙,弓弩刀剑等等。\n" +
            "- **第8-9页**：1992年，邓小平南巡，与市民亲切交谈，鼓励大家继续改革开放。\n" +
            "- **第10-11页**：中国各地的繁荣景象，工厂、农田、市场，人们脸上洋溢着幸福的笑容。\n" +
            "- **封底**：现代中国的城市和乡村，人们过着幸福美好的生活，天空中飘着“春天”的字样。\n" +
            "\n" +
            "#### 3. 旁白/文案\n" +
            "- **封面**：“这是一个关于春天的故事，一个关于希望和梦想的故事。”\n" +
            "- **第1页**：“1979年，中国还很贫穷，农村的农民们辛勤劳动，但生活依然艰难。”\n" +
            "- **第2-3页**：“这一年，一位伟大的领导人——邓小平，做出了一个重要的决定。他在东南沿海画了一个圈，设立了经济特区。”\n" +
            "- **第4-5页**：“很快，深圳等城市开始了快速的发展。工人们夜以继日地工作，一栋栋高楼拔地而起。”\n" +
            "- **第6-7页**：“几年后，深圳变成了一个现代化的城市。夜晚，高楼大厦灯火辉煌，街道上车水马龙，充满了活力。”\n" +
            "- **第8-9页**：“1992年，邓小平再次来到南方，与市民亲切交谈，鼓励大家继续改革开放。他的讲话像春风一样，带来了新的希望。”\n" +
            "- **第10-11页**：“从那以后，中国各地都发生了翻天覆地的变化。工厂繁忙，农田丰收，市场繁荣，人们的生活越来越美好。”\n" +
            "- **封底**：“今天，中国已经成为一个繁荣昌盛的国家，人们过着幸福美好的生活。这一切，都始于那个春天的故事。”\n" +
            "\n" +
            "#### 4. 角色设定\n" +
            "- **邓小平**：\n" +
            "  - **形象**：一位和蔼可亲的老人，穿着朴素的中山装，眼神坚定而充满智慧。\n" +
            "  - **性格**：睿智、果断、富有远见。\n" +
            "- **农民**：\n" +
            "  - **形象**：朴实的农民，穿着传统的衣服，面带笑容，勤劳而乐观。\n" +
            "  - **性格**：勤劳、朴实、充满希望。\n" +
            "- **工人**：\n" +
            "  - **形象**：年轻的工人，穿着工作服，戴着安全帽，满脸汗水，充满干劲。\n" +
            "  - **性格**：勤奋、热情、充满活力。\n" +
            "- **市民**：\n" +
            "  - **形象**：各行各业的人们，穿着现代服装，面带笑容，享受着城市的便利。\n" +
            "  - **性格**：快乐、自信、充满希望。\n" +
            "\n" +
            "#### 5. 情节描述\n" +
            "- **起始**：介绍1979年的中国，农村的贫困和落后。\n" +
            "- **发展**：邓小平决定设立经济特区，深圳等城市开始快速发展。\n" +
            "- **高潮**：深圳迅速崛起，成为现代化城市，其他城市也开始效仿。\n" +
            "- **转折**：1992年邓小平南巡，进一步推动改革开放。\n" +
            "- **结局**：中国各地发生翻天覆地的变化，人民生活日益改善，国家走向繁荣昌盛。\n" +
            "\n" +
            "#### 6. 插图建议\n" +
            "- **封面**：全景图，展现春天的美丽景象，现代化的城市和田野。\n" +
            "- **第1页**：1979年的农村景象，农民在田里劳作。\n" +
            "- **第2-3页**：邓小平在地图前画圈，设立经济特区。\n" +
            "- **第4-5页**：深圳的建设现场，工人们忙碌的身影。\n" +
            "- **第6-7页**：深圳的夜景，高楼大厦灯火辉煌。\n" +
            "- **第8-9页**：邓小平南巡，与市民亲切交谈。\n" +
            "- **第10-11页**：中国各地的繁荣景象，工厂、农田、市场，人们幸福的笑容。\n" +
            "- **封底**：现代中国的城市和乡村，人们过着幸福美好的生活，天空中飘着“春天”的字样";
}


